/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bean;

import java.io.Serializable;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;

import modelo.Contrato;
import modelo.Freelancer;
import modelo.Lance;
import modelo.Projeto;
import modelo.Usuario;
import util.JPAUtil;
import util.JSFUtil;
import dao.ContratoDAO;
import dao.LanceDAO;
import dao.ProjetoDAO;
import enumeracao.StatusContrato;
import enumeracao.StatusProjeto;

@ManagedBean
@SessionScoped
public class LanceBean implements Serializable {

	private EntityManager entityManager;
	private Projeto projeto = new Projeto();
	private Lance lance = new Lance();
	private ProjetoDAO projetoDAO;
	private Lance lanceSelecionado;
	private List<Lance> lances;
	private Usuario usuarioSessao;

	public EntityManager getEntityManager() {
		return entityManager;
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	public Projeto getProjeto() {
		return projeto;
	}

	public void setProjeto(Projeto projeto) {
		this.projeto = projeto;
	}

	@PostConstruct
	public void iniciar() {

		projetoDAO = new ProjetoDAO(entityManager);

		Map<String, String> params = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap();

		System.out.println(params.get("projeto"));

		// this.lances = new LanceDAO(entityManager).listar();

		// projeto = projetoDAO.consulta(1L);

	}

	public ProjetoDAO getProjetoDAO() {
		return projetoDAO;
	}

	public void setProjetoDAO(ProjetoDAO projetoDAO) {
		this.projetoDAO = projetoDAO;
	}

	public void salvar() {
	}

	public Lance getLance() {
		return lance;
	}

	public void setLance(Lance lance) {
		System.out.println(lance);
		this.lance = lance;
	}

	public String gerarContrato() {
		entityManager = JSFUtil.getEntityManager();

		LanceDAO lanceDAO = new LanceDAO(entityManager);
		lance = lanceDAO.consultar(lanceSelecionado.getId());
		Contrato contrato = new Contrato();

		contrato.setDonoProjeto(lance.getProjeto().getDonoProjeto());
		contrato.setFreelancer(lance.getFreelancer());
		contrato.setProjeto(lance.getProjeto());
		contrato.setValor(lance.getValor());
	    contrato.setLance(lance);
	    contrato.setStatus(StatusContrato.ABERTO);
	    contrato.setDataInicio(Calendar.getInstance());

		ContratoDAO contratoDAO = new ContratoDAO(entityManager);

		// Alterando o Status do Projeto

		this.projetoDAO = new ProjetoDAO(entityManager);

		Projeto projeto = contrato.getProjeto();

		projeto.setStatus(StatusProjeto.FECHADO);

		this.projetoDAO.atualizar(projeto);
		contrato.setStatus(StatusContrato.ABERTO);
		contratoDAO.inserir(contrato);

		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Contrato efetuado com Sucesso"));
		return "/donoprojeto/perfilDonoProjeto";
	}

	public String efetuarLance() {
		lance = new Lance();
		entityManager = JSFUtil.getEntityManager();
		LanceDAO lanceDAO = new LanceDAO(entityManager);

		lance.setFreelancer((Freelancer) usuarioSessao);
		lance.setProjeto(projeto);

		boolean existeLance = lanceDAO.existeLance(lance);

		if (existeLance) {
			FacesContext context = FacesContext.getCurrentInstance();
			context.addMessage(null, new FacesMessage("Notificacaoo",
					"Lance ja foi efetuado"));
			return null;
		}

		lance.setValor(projeto.getValor());
		lance.setDuracao(projeto.getDuracao());

		return "/lance/efetuarLance";

	}

	public String finalizarLance() {
		FacesContext context = FacesContext.getCurrentInstance();
		entityManager = JPAUtil.getEntityManager();
		LanceDAO lanceDAO = new LanceDAO(entityManager);
		entityManager.getTransaction().begin();
		lanceDAO.inserir(lance);
		Projeto projeto = lance.getProjeto();

		ProjetoDAO projetoDAO = new ProjetoDAO(entityManager);
		projetoDAO.atualizar(projeto);
		lance = new Lance();
		entityManager.getTransaction().commit();
		entityManager.close();

		context.addMessage(null, new FacesMessage("Sucesso",
				"Lance foi efetuado"));

		return "/freelancer/perfilFreelancer";

	}

	public Lance getLanceSelecionado() {
		return lanceSelecionado;
	}

	public void setLanceSelecionado(Lance lanceSelecionado) {
		this.lanceSelecionado = lanceSelecionado;
	}

	public List<Lance> getLances() {
		return this.lances;
	}

	public void setLances(List<Lance> lances) {
		this.lances = lances;
	}

	public void selecionar() {

		this.lances = projeto.getLances();

	}

	public Usuario getUsuarioSessao() {
		return usuarioSessao;
	}

	public void setUsuarioSessao(Usuario usuarioSessao) {
		this.usuarioSessao = usuarioSessao;
	}

}
